iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
1
Modern Web

Chrome extension 學習手札系列 第 7

Chrome extension 學習手札 07 - 基本實作 - 番茄鐘 part2

  • 分享至 

  • xImage
  •  

首要目標:製作一個icon,並且使用計時器讓我們計算工作時間,而且在每分鐘或暫停等動作的時候改變圖示的文字

好的首先,我就隨便用XD做一個很簡便的番茄icon,然後把他放到我們的manifest上吧

然後我們現在需要用的計時器是 chrome.alarm,依照官方文獻顯示需要alarms權限,
而且我們不需要浮動頁面,所以browser_action只需要title以及icon就好了

manifest.json

{
    "manifest_version": 2,
    "name": "Pomodoro",
    "version": "1.0.0",
    "description": "This is a Pomodoro Technique chrome extension",
    "icons": {
        "48": "icons/my48.png"
    },
    "browser_action":{
        "default_icon": "icons/my48.png",
        "default_title": "Pomodoro"
    },
    "options_page": "optionPage/option.html",
    "content_scripts": [
        {
          "matches": ["*://*.youtube.com/*"],
          "js": ["content_script/base_script.js"]
        }
      ],
      "background" :{
          "scripts" :["background/bg.js"],
          "persistent" : false
      },
      "permissions": [
        "activeTab", 
        "alarms"
      ]
}

接下來商業邏輯就寫在後台腳本裡,我們需要一個主控台來管理時間與工作狀態,那就把靜態資料先整理進來

background/bg.js

    //每次工作時間
    this.workTime = 25;
    //每次小休息時間
    this.restTime = 5;
    //每次大休息時間
    this.bigRestTime = 15;
    //時間類型
    this.timer = "work"; // 'work' or 'rest'
    //時鐘是否運行中
    this.isRun = false;

接下來我們需要捕捉點選icon的事件,所以使用chrome.browserAction的onClicked事件,
註:此事件在browser_action有default_popup時無法使用

    //當點擊icon時觸發事件
    chrome.browserAction.onClicked.addListener()

然後我們要啟動與停止時鐘的事件

  //開始時鐘
  start() {
    chrome.alarms.create(ALARM_NAME, {
      delayInMinutes: 1,
      periodInMinutes: 1
    });
  }
  //暫停時鐘
  stop() {
    chrome.alarms.clear(ALARM_NAME)
  }

還有時鐘每個頻率會觸發的事件

    //當時鐘運轉時呼叫事件
    chrome.alarms.onAlarm.addListener(callback)

把全部混起來就是

background/bg.js

//時鐘名稱
const ALARM_NAME = "pomodoro";

class Pomodoro {
  constructor() {
    //每次工作時間
    this.workTime = 25;
    //每次小休息時間
    this.restTime = 5;
    //每次大休息時間
    this.bigRestTime = 15;
    //時間類型
    this.timer = "work"; // 'work' or 'rest'
    this.isRun = false;

    //當點擊icon時觸發事件
    chrome.browserAction.onClicked.addListener(()=>{this.handleIconClick()})
    //當時鐘運轉時呼叫事件
    chrome.alarms.onAlarm.addListener(()=>{this.handleAlarm()})
    //先預設第一次的icon文字
    chrome.browserAction.setBadgeText({ text: '-'})
  }

  //點擊事件
  handleIconClick() {
    //正在執行就停止
    if (this.isRun) {
      chrome.browserAction.setBadgeText({ text: '-' })
      this.stop()
    }
    //開始
    else {
      this.start()
      chrome.browserAction.setBadgeText({ text: String(this.workTime) })
    }
    this.isRun = !this.isRun;
  }

  //時鐘事件
  handleAlarm() {
    if(this.workTime - 1 < 1){
        this.stop()
    }
    if (this.timer === "work") {
      this.workTime--
      chrome.browserAction.setBadgeText({ text: String(this.workTime) })
    }
  }

  //開始時鐘
  start() {
    chrome.alarms.create(ALARM_NAME, {
      delayInMinutes: 1,
      periodInMinutes: 1
    });
    chrome.alarms.getAll(function(array){
        console.log(array);
    })
  }
  //暫停時鐘
  stop() {
    chrome.alarms.clear(ALARM_NAME)
  }

}

var pomodoro = new Pomodoro();

所以載入extension以後就會長這樣

如果點擊第一次

過一分鐘以後再看一次

如果點擊第二次就會回減字號

那今天就先把顯示與時間先處理好了,其他的我們再接再厲!


上一篇
Chrome extension 學習手札 06 - 基本實作 - 番茄鐘 part1
下一篇
Chrome extension 學習手札 08 - 基本實作 - 番茄鐘 part3
系列文
Chrome extension 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Nono
iT邦新手 5 級 ‧ 2019-09-20 11:54:26

番茄也畫得太可愛XD

崔斯 iT邦新手 5 級 ‧ 2019-09-20 13:45:19 檢舉

還好只是番茄,不然就畫不出來了

我要留言

立即登入留言